package com.big.common.mybatis.base.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.big.common.core.result.PageQuery;
import com.big.common.core.result.Query;
import com.big.common.mybatis.base.domain.entity.BaseEntity;
import com.big.common.mybatis.result.PageResult;
import com.big.common.mybatis.util.PageQueryWrapper;

import java.util.List;

/**
 * <p>
 * 通用服务类
 * </p>
 *
 * @author 山归岿
 * @create 2025-06-21-15:01
 */
public interface BaseService<DTO, T extends BaseEntity> extends IService<T> {
    /**
     * 分页查询
     */
    PageResult<DTO> page(PageQuery<DTO> pageQuery);

    /**
     * 根据 id 查询
     */
    DTO getByIdDTO(String id);

    /**
     * 查询集合
     */
    List<DTO> listDTO(Query<DTO> query);

    /**
     * 添加
     */
    String add(DTO dto);

    /**
     * 批量新增
     */
    boolean addBatch(List<DTO> entityList, int batchSize);

    /**
     * 修改
     */
    String update(DTO dto);

    /**
     * 批量修改
     */
    boolean updateBatch(List<DTO> entityList, int batchSize);

    /**
     * 删除
     */
    boolean delete(String id);

    /**
     * 批量删除
     */
    boolean deleteBatch(List<String> ids);

    // ==================== 查询操作钩子 ====================

    /**
     * 前置处理钩子：在构建查询条件后、执行查询前调用
     * 子类可重写此方法来自定义查询逻辑
     *
     * @param wrapper 查询包装器，可修改查询条件
     */
    default void beforePageQuery(PageQueryWrapper<T, DTO> wrapper) {
        // 默认空实现，子类可覆盖
    }

    /**
     * DTO转换后处理钩子：在每个DTO转换完成后调用
     *
     * @param records 转换后的DTO对象
     */
    default void afterDtoConverted(List<DTO> records) {
        // 默认空实现，子类可覆盖
    }

    /**
     * 查询单个后处理钩子：再转 DTO 后调用
     *
     * @param entity 待插入的实体对象
     */
    default void afterEntityInserted(DTO entity) {
    }

    /**
     * 处理全部查询：构建查询条件的时候使用
     */
    default void beforeAllQuery(QueryWrapper<T> wrapper, DTO dto) {
    }

    /**
     * 查询全部后处理钩子：再转 DTO 后调用
     */
    default void afterAllEntitiesInserted(List<DTO> entities) {
    }

    // ==================== 新增操作钩子 ====================

    /**
     * 新增前置处理钩子：在新增操作前调用
     * 适用于 add(), addBatch() 方法
     *
     * @param dto 要新增的DTO对象
     */
    default void beforeAdd(DTO dto) {
        // 默认空实现
    }

    /**
     * 新增后置处理钩子：在新增操作后调用
     * 适用于 add(), addBatch() 方法
     *
     * @param entity 新增后的实体对象
     */
    default void afterAdd(DTO entity) {
        // 默认空实现
    }

    /**
     * 批量新增前置处理（整个批次）
     *
     * @param dtoList 要新增的DTO列表
     */
    default void beforeBatchAdd(List<DTO> dtoList) {
        // 默认空实现
    }

    /**
     * 批量新增后置处理（整个批次）
     *
     * @param entities 新增后的实体列表
     */
    default void afterBatchAdd(List<DTO> entities) {
        // 默认空实现
    }

    // ==================== 更新操作钩子 ====================

    /**
     * 更新前置处理钩子：在更新操作前调用
     * 适用于 update(), updateBatch() 方法
     *
     * @param dto 要更新的DTO对象
     */
    default void beforeUpdate(DTO dto) {
        // 默认空实现
    }

    /**
     * 更新后置处理钩子：在更新操作后调用
     * 适用于 update(), updateBatch() 方法
     *
     * @param entity 更新后的实体对象
     */
    default void afterUpdate(DTO entity) {
        // 默认空实现
    }

    /**
     * 批量更新前置处理（整个批次）
     *
     * @param dtoList 要更新的DTO列表
     */
    default void beforeBatchUpdate(List<DTO> dtoList) {
        // 默认空实现
    }

    /**
     * 批量更新后置处理（整个批次）
     *
     * @param entities 更新后的实体列表
     */
    default void afterBatchUpdate(List<DTO> entities) {
        // 默认空实现
    }

    // ==================== 删除操作钩子 ====================

    /**
     * 删除前置处理钩子：在删除操作前调用
     * 适用于 delete(), deleteBatch() 方法
     *
     * @param id 要删除的ID
     */
    default void beforeDelete(String id) {
        // 默认空实现
    }

    /**
     * 删除后置处理钩子：在删除操作后调用
     * 适用于 delete(), deleteBatch() 方法
     *
     * @param id 已删除的ID
     */
    default void afterDelete(String id) {
        // 默认空实现
    }

    /**
     * 批量删除前置处理（整个批次）
     *
     * @param ids 要删除的ID列表
     */
    default void beforeBatchDelete(List<String> ids) {
        // 默认空实现
    }

    /**
     * 批量删除后置处理（整个批次）
     *
     * @param ids 已删除的ID列表
     */
    default void afterBatchDelete(List<String> ids) {
        // 默认空实现
    }
}
